Run gtk_drag_source_info_destroy in an idle, workaround for bug #501588,
authorRichard Hult <richard@imendio.com>
Sun, 25 May 2008 15:11:11 +0000 (15:11 +0000)
committerRichard Hult <rhult@src.gnome.org>
Sun, 25 May 2008 15:11:11 +0000 (15:11 +0000)
2008-05-25  Richard Hult  <richard@imendio.com>

* gtk/gtkdnd-quartz.c: (gtk_drag_drop_finished): Run
gtk_drag_source_info_destroy in an idle, workaround for bug
#501588, that makes any code that uses the context returned from
gtk_drag_begin() crash, like treeview/iconview dnd.
(GdkDragSourceOwner::provideDataForType): only use the data if we
got any.

svn path=/trunk/; revision=20151

ChangeLog
gtk/gtkdnd-quartz.c

index aebc390bdfb64bbd14c32a68f95dd67a475c8288..d1522ee64d7a0a1ed596edc73531ac3530004909 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2008-05-25  Richard Hult  <richard@imendio.com>
+
+       * gtk/gtkdnd-quartz.c: (gtk_drag_drop_finished): Run
+       gtk_drag_source_info_destroy in an idle, workaround for bug
+       #501588, that makes any code that uses the context returned from
+       gtk_drag_begin() crash, like treeview/iconview dnd.
+       (GdkDragSourceOwner::provideDataForType): only use the data if we
+       got any.
+
 2008-05-25  Jan Arne Petersen  <jpetersen@jpetersen.org>
 
        * gtk/gtkfilechooserdefault.c: (create_file_list): Add GDK_ACTION_MOVE
index 4bfc34e7f2e5d5dd34041824ebffd5705cca3581..a443d2ee06dd2a76e84c42bb89a4d340f0ac48b6 100644 (file)
@@ -143,6 +143,7 @@ struct _GtkDragFindData
 
   selection_data.selection = GDK_NONE;
   selection_data.data = NULL;
+  selection_data.length = -1;
   selection_data.target = _gtk_quartz_pasteboard_type_to_atom (type);
 
   if (gtk_target_list_find (info->target_list, 
@@ -155,7 +156,8 @@ struct _GtkDragFindData
                             target_info,
                             time);
 
-      _gtk_quartz_set_selection_data_for_pasteboard (sender, &selection_data);
+      if (selection_data.length >= 0)
+        _gtk_quartz_set_selection_data_for_pasteboard (sender, &selection_data);
       
       g_free (selection_data.data);
     }
@@ -1769,10 +1771,21 @@ gtk_drag_source_info_destroy (GtkDragSourceInfo *info)
   g_free (info);
 }
 
+static gboolean
+drag_drop_finished_idle_cb (gpointer data)
+{
+  gtk_drag_source_info_destroy (data);
+  return FALSE;
+}
+
 static void
 gtk_drag_drop_finished (GtkDragSourceInfo *info)
 {
-  gtk_drag_source_info_destroy (info);
+  /* Workaround for the fact that the NS API blocks until the drag is
+   * over. This way the context is still valid when returning from
+   * drag_begin, even if it will still be quite useless. See bug #501588.
+  */
+  g_idle_add (drag_drop_finished_idle_cb, info);
 }
 
 /*************************************************************